
package jeudelavie.modele;

import java.awt.Color;
import java.util.Random;
import javax.swing.JPanel;

/**
 *
 * @author epulapp
 */
public class Case {
    
    private Random rdm = new Random();
    private Environnement environnement;
    private int x, y; // Positions
    private boolean etat, etatSuivant; // cellule présente = true
    private Color couleur;
    private Color couleurSuivante;
    
    public Case(int _x, int _y, Environnement _env){
        x= _x;
        y= _y;
        environnement = _env;
        couleur = Color.red;
        etat = rdm.nextBoolean();
    }
    
        public Case(int _x, int _y, Environnement _env, boolean blanche){
        x= _x;
        y= _y;
        environnement = _env;
        if (blanche)
            etat = false;
        else
            etat = true;
    }
    
    /**
     * Calcul l'état suivant
     */
    public void calculEtatSuivant() {
        etatSuivant = getEtatSuivant(environnement.getVoisines(this));
    }
    
    /**
     * Met à jour l'état au suivant
     */
    public void majEtat() {
        etat = etatSuivant;
        couleur = couleurSuivante;
    }
    
    /**
     * Retour l'état suivant en fonction des cases adjacentes
     * @param casesVoisines
     * @return boolean
     */
    private boolean getEtatSuivant(Case[] casesVoisines) {
        // On compte le nombre de cellules voisines
        int cpt = 0;
        int nbCoul=0;
        int indice = 0;
        Color couleurRef = null;
        for (int i = 0; i < casesVoisines.length; i++) {
            if (casesVoisines[i] != null && casesVoisines[i].etat){ 
                cpt++;
                if (casesVoisines[i].getCouleur() != couleurRef){
                    couleurRef = casesVoisines[i].getCouleur();
                    indice = i;
                    nbCoul = 1;
                }else{
                    nbCoul++;
                }
            }
        }
        // Application des règles du jeu
        if (this.etat) {
            if (cpt <= 1 || cpt >= 4){
                couleurSuivante = Color.white;
                return false;
            }else {
                couleurSuivante = couleur;
                return true;
            }
        } else {
            if (cpt == 3 && nbCoul == 3){
                couleurSuivante = casesVoisines[indice].getCouleur();
                return true;
            }else{
                couleurSuivante = Color.white;
                return false;
            }
        }
    }
    
    /**
     * Getters / setters
     */
    
    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public boolean isEtat() {
        return etat;
    }
    
    public void setEtat(boolean _e){
        etat = _e;
    }
    
    public Color getCouleur(){
        return couleur;
    }
    
    public void setCouleur(Color _c){
        couleur = _c;
    }
}
